/*
如果对象中没有其他资源(如：堆，文件，系统资源等)，深拷贝和浅拷贝。
深拷贝：为指针成员分配新的内存空间，并复制原对象中的数据到新的内存
保证每个对象有自己独立的一份数据，不会共享一块内存，不会引发双重释放问题
*/

#include <iostream>
#include <string>

using namespace std;
// namespace

class Student
{
private:
	int val;

public:
	int *ptr;
	Student() : val(10) {

				};
	// 有参构造
	// string *ptr=new string(ptr_val);
	Student(int val, int ptr_val) : val(val), ptr(new int(ptr_val))
	{

		cout << "我是有参构造" << endl;
	}

	// 深拷贝 参数列表 const 类名 & 变量名
	Student(const Student &other)
	{
		cout << "调用拷贝构造函数" << endl;
		// 考虑对象的指针是否为空
		if (NULL == other.ptr)
		{
			ptr = other.ptr;
		}
		else
		{
			// 如果传入的不是null 则 需要将值取出 并重新 创建空间
			/* *other.ptr==解引用得到要拷贝对象的值，
			然后用 new string(值):申请一片空间并将拷贝出来的值对其初始化
			然后ptr指向新开辟的空间*/
			ptr = new int(*other.ptr);
		}
		val = other.val;
	}
	// 申请了空间一定要记得析构
	~Student()
	{
		if (NULL != ptr)
		{
			cout << "调用析构 释放空间完成" << endl;
			delete ptr;
		}
	}

public:
	void show()
	{
		cout << val << endl;
		cout << *ptr << endl;
	}
};

using namespace std;

int main(int argc, char const *argv[])
{

	Student s1(2407, 1);
	Student s2(s1);

	*s2.ptr = 78;
	cout << "*s2.ptr=" << *s2.ptr << endl;
	cout << "*s1.ptr=" << *s1.ptr << endl;

	return 0;
}
